import time
import datetime
import ctypes
import sys
import logging
import os
from pathlib import Path

class CommonUtil:
    """
    通用工具类
    """

    @staticmethod
    def get_current_time():
        """
        获取当前时间戳
        :return: 当前时间戳
        """
        return int(time.time())
    
    @staticmethod
    def get_current_day_time():
        """
        获取当前时间格式一，精确到秒
        :return: 当前时间字符串
        """
        return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    @staticmethod
    def get_current_day_time_no_symbol():
        """
        获取当前时间格式二，精确到秒
        :return: 当前时间字符串
        """
        return datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    
    @staticmethod
    def get_current_day_time_hour_no_symbol():
        """
        获取当前时间格式三，精确到时
        :return: 当前时间字符串
        """
        return datetime.datetime.now().strftime("%Y%m%d%H")

    @staticmethod
    def get_current_day_time_ms():
        """
        获取当前时间，精确到毫秒
        :return: 当前时间字符串（毫秒级）
        """
        return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
    
    @staticmethod
    def get_current_day():
        """
        获取当前日期
        :return: 当前日期字符串
        """
        return datetime.datetime.now().strftime("%Y-%m-%d")
    
    @staticmethod
    def is_administrator():
        """
        判断当前用户是否为管理员
        :return: 如果当前用户为管理员则返回True，否则返回False
        """
        try:
            return ctypes.windll.shell32.IsUserAnAdmin()
        except:
            return False

    @staticmethod
    def get_script_current_directory():
        """
        获取当前执行脚本所在目录（支持打包后的情况）
        :return: 脚本所在目录路径
        """
        if getattr(sys, 'frozen', False):
            return Path(sys.executable).parent.absolute()
        else:
            return Path(sys.argv[0]).parent.absolute()

    @staticmethod
    def logger(loggerName):
        """
        获取日志记录器
        """
        lu = LoggerUtil(loggerName)
        return lu.setup_logger()


##################################################################################################
class LoggerUtil:
    """
    日志工具类
    """

    def __init__(self, logger_name = None):
        super().__init__()
        # 日志记录器名称
        if logger_name is None or logger_name == "":
            self.logger_name = "公共"
        else:
            self.logger_name = logger_name
        # 日志级别
        self.level = logging.DEBUG

    def setup_logger(self):
        """
        配置日志记录，初始化日志记录器
        """
        logger = logging.getLogger(self.logger_name)
        if not logger.handlers:
            logger.setLevel(self.level)
            # 确保日志目录存在
            log_dir = os.path.join(CommonUtil.get_script_current_directory(), 'logs')
            if not os.path.exists(log_dir):
                os.makedirs(log_dir)
            # 日志格式
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s \t\t: %(message)s')
            # 1)创建文件处理器
            log_name = CommonUtil.get_current_day_time_hour_no_symbol()+".log"
            file_handler = logging.FileHandler(os.path.join(log_dir, log_name), encoding='utf-8')
            file_handler.setLevel(self.level)
            file_handler.setFormatter(formatter)
            # 2)添加控制台处理器
            console_handler = logging.StreamHandler()
            console_handler.setLevel(self.level)
            console_handler.setFormatter(formatter)
            # 添加处理器
            logger.addHandler(file_handler)
            logger.addHandler(console_handler)
        return logger
